第 2 章 从 R Markdown 到 HTML 文档 |
您所在的位置:网站首页 › print 语言怎么转换 › 第 2 章 从 R Markdown 到 HTML 文档 |
2.4 组件和内容
2.4.1 理解 HTML 文档的依赖关系
前面已经提过,R Markdown 输出的 HTML 文档时,依赖于软件包提供的 HTML 模板。 实际上,HTML 文档的样式和功能很大程度上依赖于一些 CSS 样式和 JavaScript 库的支持。 这里面包括 Bootstrap,JQuery 等优秀的开源项目。 默认情况下,R Markdown 输出的 HTML 文档是一个单一的 .html 文件。这是由 self_contained: true 控制的。.html 文件中,会使用 data: 存储包括 JavaScript、CSS、图片和视频在内的全部资料。这样的一个封装,使得用户可以像分享 PDF 或 Word 文档那样分享文件,同时享受超链接、动态效果等一系列 HTML 特性。 如果你指定 self_contained: false,那么 HTML 文档将会将自身的依赖文件单独存放。 --- title: "Habits" output: html_document: self_contained: false ---默认情况下,在 .html 文件同一目录会生成同名的 _files 文件夹,存放相应的依赖文件。下面是默认情况下一份 HTML 文档所包含的依赖文件。 +---anchor-sections-1.0 +---bootstrap-3.3.5 | +---css | | \---fonts | +---fonts | +---js | \---shim +---header-attrs-2.5 +---highlightjs-9.12.0 +---jquery-1.11.3 \---navigation-1.1库文件夹的位置可以由 lib_dir: xxx 指定,例如: --- title: "Habits" output: html_document: self_contained: false lib_dir: libs ---依赖文件的内容会随配置变化,例如当在 YAML 配置中加入 df_print: paged 之后,依赖文件中会多一个 pagedtable-1.1 的子文件夹出来。 显然,存放依赖的子文件夹依据 库名 + 版本号 的规则命名。要弄清楚库文件的全部特性,可能要对库本身有相当的理解才行。而 R Markdown 则是把最常用的功能整合提供给了我们。 当文档的内容比较少,同时又有多个类似的文档的时候,库文件所占的存储空间可能比你自己编写的内容还要大得多。这种情况下,将库文件统一存储在指定的 libs 文件夹,可以实现库文件公用。 另外,有些库文件不常用,或者文件太大,还可以通过库文件的服务器调用。例如下面要讲的 MathJax 库。 2.4.2 MathJax 库的配置HTML 文档需要 MathJax 脚本来渲染 Latex 和 MathML 公式,调用 MathJax 的方式则可以通过 mathjax 参数来调整。 "default":默认配置,会通过 HTTPS 链接从 RStudio 的 CDN 网络服务器上调用; "local":与 self_contained: false 联合使用时,会将 MathJax 库文件保存在本地目录中; 设置一个 URL 链接,指向可用的 MathJax 库文件地址; null:完全不使用 MathJax。 例如,使用 MathJax 的本地拷贝可以如下配置: --- title: "Habits" output: html_document: mathjax: local self_contained: false ---为 MathJax 配置一个新的可用来源。 --- title: "Habits" output: html_document: mathjax: "http://example.com/MathJax.js" ---不使用 MathJax。 --- title: "Habits" output: html_document: mathjax: null --- 2.4.3 是否保留 Markdownknitr 处理 R Markdown 文件时,会先生成一个 Markdown 文件(*.md),随后再由 Pandoc 转换成 HTML 文档。如果需要保留这个 Markdown 文件,可以使用 keep_md 选项。 --- title: "Habits" output: html_document: keep_md: true --- 2.4.4 使用自定义的 HTML 模板使用 template 选项,可以配置 Pandoc 转换时使用的模板。 --- title: "Habits" output: html_document: template: another_template.html ---Pandoc 模板遵循特定的格式,有关的进一步信息可以在 Pandoc 模板 页面获得。 下面是一个 HTML 模板的示例: $title$ $for(css)$ $endfor$ $body$这其中包括一些变量,如 $title$,$body$ 等。这些变量由 Pandoc 定义,完整的变量列表参见这里。 这样的 HTML 模板使得高度定制化的输出成为可能。例如,你可以在 区域加入任意的 CSS 样式, JavaScript 代码,以及其它的开源库。 另外,还可以定义一些新变量来控制文档的格式化。例如,定义一个布尔值 draft 来确定文档是一个草稿还是最终版本。 .logo { float: right; } $if(draft)$ $else$ $endif$ $body$draft 在 YAML 元数据中赋值。 --- title: "An Important Report" draft: true output: html_document: template: my-template.html ---说明:rmarkdown 软件包默认使用自带的 HTML 模板,一些方面与 Pandoc 默认的模板存在差异。如果有 template: null 的话,则 Pandoc 的模板会被使用。 2.4.5 包含其它文件使用 includes 选项,可以在 HTML 文档的不同位置嵌入其它的 HTML 格式内容。可选的位置包括在 HTML 文档的 header、body 前/后等。 --- title: "Habits" output: html_document: includes: in_header: header.html before_body: doc_prefix.html after_body: doc_suffix.html ---这种方式可以很方便的为文档加入一些第三方功能和公用的元件。例如在 in_header 中导入预定义的 CSS 样式表和 Javascript 脚本,在 before_body 中加入导航栏,在 after_body 中加入一个底栏等。 下面的例子中,即添加了一个简单的底栏。将其中内容保存到一个 HTML 文件中,放在 after_body 后面即可。 Copyright © R Markdown 指南 2021除了以上几种常用的位置,你还可以在任意地方插入 HTML 内容。实现这一功能的途径至少有两种。 一是使用 htmltools::includeHTML() 方法: ```{r, echo=FALSE, results='asis'} htmltools::includeHTML('file.html') ```二是使用 xfun::file_string() 方法: ```{r, echo=FALSE, results='asis'} xfun::file_string('file.html') ```需要注意的是,导入的 HTML 文件必须是 HTML 片段,而不能是一个完整的 HTML 文档。完整的 HTML 文件中有 标签,解析时会造成错误。比如下面就是一个无效的例子: Parent HTML file. Child HTML file. 2.4.6 生成 HTML 片段HTML 片段是一个不完整的 HTML 文件,这种片段适合用于嵌入其它的网页或者内容管理系统(如博客)中。HTML 片段也不自带主题和代码高亮,而通过继承的方式使用其嵌入文件或系统的设置。这样的 HTML 片段,也非常适合用于包含在其它文件中(参见 2.4.5)。 --- output: html_fragment ---下面是一个 HTML 片段的例子: HTML 片段可以有标题和代码区域,但是不包含任何 CSS 定义。 head(mtcars) ## mpg cyl disp hp drat wt qsec vs am gear carb ## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 ## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 ## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 ## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 ## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 ## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1将这些内容保存为一个 HTML 文件,导入此处,则效果如下所示: HTML 片段可以有标题和代码区域,但是不包含任何 CSS 定义。 head(mtcars) ## mpg cyl disp hp drat wt qsec vs am gear carb ## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 ## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 ## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 ## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 ## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 ## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1HTML 片段的内容到此结束。 2.4.7 使用自定义的浏览器图标通过在 in_header 部位导入 HTML 内容,可以为 HTML 文档设定一个自定义的浏览器图标。 将下面的内容保存到一个名为 header.html 的文档中。 然后通过 includes 导入文件的内容,则可以改变浏览当前文档时的浏览器图标。 output: html_document: includes: in_header: header.html 2.4.8 共用 YAML 配置文件当前目录中的 _output.yml 文件是一个配置文件,其中的设置可以被目录下所有的 R Markdown 文档公用。需要注意的是,该文件中的内容不需要使用--- 和 output 标签。 如下所示: html_document: self_contained: false theme: united highlight: textmate而不应该写成下面这种样子: --- output: html_document: self_contained: false theme: united highlight: textmate --- 2.4.9 嵌入 Rmd 源文件当你分享一个 R Markdown 生成的 HTML 文档给他人的时候,对方可能还想找你索取 .Rmd 源文件。在头文件中配置 code_download 参数可以在 HTML 文档中嵌入源文件。 output: html_document: code_download: true打开 code_download 选项后,页面中会出现一个下载按钮,点击下载按钮即可获得源文件。 2.4.10 嵌入其它文件嵌入 .Rmd 源文件可能还不足以重现 R Markdown 中结果,通常还会需要原始数据等其它内容。要将这些内容嵌入 HTML 文档中,也是很容易实现的。 这一功能通过 xfun 软件包(R-xfun?) 实现,依赖于 htmltools 和 mime 软件包。要使用这一功能,首先确保这两个软件包可用。 xfun::pkg_load2(c('htmltools', 'mime'))现在,就可以随意嵌入各种文件了。 ```{r echo=FALSE} # 不但可以嵌入一个文件 xfun::embed_file('source.Rmd') # 还可以嵌入多个文件 xfun::embed_files(c('source.Rmd', 'data.csv')) # 甚至一个目录也不在话下 xfun::embed_dir('data/', text = 'Download full data') ```不仅如此,你还可以编程技巧嵌入所需的文件。 # 嵌入当前目录下所有的 Rmd 和 csv 文件 xfun::embed_files(list.files('.', '[.](Rmd|csv)$'))说明:当嵌入多个文件时,其工作原理是:首先将这些文件压缩成 Zip 格式,然后将 Zip 文件嵌入到 HTML 文档中。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |